package com.vates.vsp.servicios.disponibilidad;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.vates.vsp.auxiliar.Disponibilidad;
import com.vates.vsp.entidades.Hotel;
import com.vates.vsp.entidades.TipoHabitacion;
import com.vates.vsp.exceptions.HotelNoExistException;
import com.vates.vsp.servicios.hotel.HotelService;

@Service(value = "disponibilidadSrv")
public class DisponibilidadServiceImpl implements DisponibilidadService {

	@Autowired
	private HotelService hotelSrv;
	
	@PersistenceContext(unitName="vsp-final", type=PersistenceContextType.EXTENDED)
	private EntityManager em;

	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@Override
	public List<Disponibilidad> consultaDisponibilidadHotel(Long numeroHotel,
			Date fechaInicio, Date fechaFin) throws HotelNoExistException {
		
		Query q = em.createQuery("SELECT sum(r.cantidad) FROM Reserva r "
				+ " WHERE r.tipoHabitacion.idTipoHab = :tipo "
				+ " AND ((r.fechaIni BETWEEN :inicio AND :fin) OR "
				+ " (r.fechaFin BETWEEN :inicio AND :fin) OR "
				+ " (r.fechaIni <= :inicio AND r.fechaFin >= :fin)) ");

		Integer ocupadas = new Integer(0);
		int libre = 0;
		
		Hotel hotel = hotelSrv.buscarHotelPorId(numeroHotel);

		List<Disponibilidad> disponibilidad = new LinkedList<Disponibilidad>();

		for (TipoHabitacion tipoHabitacion : hotel.getTipoHabitaciones()) {
			q.setParameter("tipo", tipoHabitacion.getIdTipoHab());
			q.setParameter("inicio", fechaInicio);
			q.setParameter("fin", fechaFin);
			
			if(q.getSingleResult() != null) {
				System.out.println(q.getSingleResult().toString());
				ocupadas = Integer.parseInt(q.getSingleResult().toString());
			}
			else {
				ocupadas = null;
			}

			if (ocupadas == null) {
				libre = tipoHabitacion.getCantidad();
			} else {
				libre = tipoHabitacion.getCantidad() - ocupadas.intValue();
			}
			
			// agrego solo las que tienen disponibles
			//if(libre > 0)
				disponibilidad.add(new Disponibilidad(tipoHabitacion, libre));
		}
		return disponibilidad;
	}
}
